package cn.tedu.justone.pack02;

/**
 * ZZ：JustOne
 * VX：Andylau2020smile
 * DY：JustOne2018
 * ZT：《演示wait与sleep的不同》
 */
public class Demo13_案例测试wait与sleep的不同 {

    //wait与sleep的不同
    //1,所属对象不同：sleep是Thread的方法用线程调用；wait是Object的方法用锁对象调用。
    //2,对待锁对象的态度不同：sleep不会释放锁对象；wait会释放锁对象
    //3,唤醒方式不同：sleep定时自动唤醒；wait除定时自动唤醒，还可以使用notify或notifyAll唤醒。
    //4,使用场景不同：sleep可以在任何地方使用，wait只能在同步控制方法或同步代码块中使用。

    //本例演示wait与sleep的对锁对象的态度
    public static void main(String[] args) {
        Thread t1 = new MyThread02();
        Thread t2 = new MyThread02();
        Thread t3 = new MyThread02();
        t1.setName("t1");
        t2.setName("t2");
        t3.setName("t3");

        t1.start();
        t2.start();
        t3.start();
    }
}

class MyThread02 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            Table02.subNum();
        }
    }
}

class Table02{
    public static final String LOCK = "刘景景";
    public static int num = 5;

    public static void subNum(){
        synchronized(LOCK){
            if(num>0){
                try {
                    //Thread.sleep(100);//不会变成负数，因为持有着线程锁
                    LOCK.wait(1000);//会变成负数，因为释放了线程锁
                    num--;
                    System.out.println("执行了减数,当前数量是" + num);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

